package dao;

import hibernateUtils.HibernateUtil;

import java.util.List;

import model.Mesa;
import model.Mozo;
import model.Sector;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import beans.MozoBean;
import beans.SectorBean;
import controller.AdministradorMozo;
import controller.AdministradorSector;

public class HibernateSectorDAO {

	private static HibernateSectorDAO instancia = null;
	private static SessionFactory sf = null;

	public static HibernateSectorDAO getInstancia() {
		if (instancia == null) {
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateSectorDAO();
		}
		return instancia;
	}

	public void grabarSector(SectorBean s) {
		/*
		 * Convierto el parametro a bean SectorBean aux = new SectorBean();
		 * aux.setNombre(s.getNombre());
		 * 
		 * for(MesaDTO m:s.getMesas()){ MesaBean mesa=new MesaBean();
		 * mesa.setCapacidad(m.getCapacidad()); mesa.setNumero(m.getNumero());
		 * aux.addMesa(mesa);
		 */

		/* Abro sesion y grabo el objeto */
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(s);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public List<Sector> getSectores(int idSalon) {
		Session session = sf.openSession();

		List<SectorBean> aux = session
				.createQuery(
						"select sec from SalonBean s join s.sectores sec where s.idSalon=?")
				.setInteger(0, idSalon).list();

		List<Sector> sectores = AdministradorSector.getInstancia()
				.fromBeanTOModel(aux);

		/*
		 * for(SectorBean sb:aux){ Sector s=new Sector();
		 * s.setNombre(sb.getNombre()); s.setIdSector(sb.getIdSector());
		 * 
		 * for(MesaBean m:sb.getMesas()){ Mesa mesa=new Mesa();
		 * mesa.setCapacidad(m.getCapacidad()); mesa.setNumero(m.getNumero());
		 * s.agregarMesa(mesa);
		 * 
		 * 
		 * } sectores.add(s); }
		 */
		session.close();
		return sectores;
	}

	public Mozo getMozo(List<Mesa> mesasParaAbrir) {
		Mesa m = mesasParaAbrir.get(0);
		Session session = sf.openSession();
		List<MozoBean> mozos = session
				.createQuery(
						"select moz from SectorBean s join s.mesas m join s.mozos moz where m.numero=?")
				.setInteger(0, m.getNumero()).list();
		return AdministradorMozo.getInstancia().fromBeanTOModel(mozos.get(0));
	}

	// me devuelve el mozo que menos mesas esta atendiendo del sector de la mesa
	// que se quiere abrir
	public Mozo getMozoMasLibre(List<Mesa> mesasParaAbrir) {
		Mesa m = mesasParaAbrir.get(0);
		Session session = sf.openSession();
		// obtengo el sector de la mesa
		Query q = session.createQuery(
				"select s from SectorBean s join s.mesas m where m.numero=?")
				.setInteger(0, m.getNumero());
		SectorBean sb = (SectorBean) q.uniqueResult();

		// obtengo las mesas de ese sector
		Query q2 = session.createQuery(
				"select m from SectorBean s join s.mesas m where s.idSector=?")
				.setInteger(0, sb.getIdSector());
		List<Object> mesas = q2.list();
		Query q3 = session
				.createQuery(
						"select moz.idEmpleado from SucursalBean s join s.salon sal "
								+ "  join sal.sectores sec join sec.mozos moz left join s.ventas v "
								+ " where v.estado=? and sec.idSector=? "
								+ "	group by moz.idEmpleado order by count(*) desc ")
				.setString(0, "abierta").setInteger(1, sb.getIdSector());

		q3.setFirstResult(0);
		q3.setMaxResults(1);
		Object o = q3.uniqueResult();
		if (o == null)
			return this.getMozo(mesasParaAbrir);

		int idMozo = (Integer) o;
		MozoBean mb = new MozoBean();
		mb.setIdEmpleado(idMozo);

		return AdministradorMozo.getInstancia().fromBeanTOModel(
				HibernateMozoDAO.getInstancia().buscarMozo(mb));
	}

	public SectorBean buscarSector(SectorBean ab) {
		Session session = sf.openSession();
		SectorBean sector = (SectorBean) session.get(SectorBean.class,
				ab.getIdSector());
		session.close();
		return sector;
	}

}
